package com.xianyl.libsforandroid.flash;

import java.util.ArrayList;
import java.util.List;


import com.xianyl.libsforandroid.XConstent;
import com.xianyl.libsforandroid.utils.ArrayUtils;
import com.xianyl.libsforandroid.utils.PreferencesUtils;


import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;



/**
 * 引导页辅助类,activity实现GuideListener
 * 使用以下两个方法
 * {@link #initGuideImage(Context, FrameLayout, Integer[])} 必须使用
 * {@link #initDots(Context, FrameLayout, Integer[])} 可选使用
 * @author xianyl
 * @date 2015-3-3 下午10:07:00
 */
public class Guide implements OnPageChangeListener{
	private Context mContext;
	private GuideListener mGuideListener;	
	
	/**装图片的控件**/
	private ViewPager mViewPager;
	private VPAdapter mVPAdapter;
	/**图片列表**/
	private List<View> views;
	/**记录当前选中位置**/ 
	private int currentIndex;	
	
	/**显示第几页引导页的标识**/ 
	private ImageView[] dots;
	/**开始按键**/ 
	private View startBTN;
	/**开始按键是否长期显示**/ 
	private boolean startBTNisVISIBLE;
	
	/**声音池对象**/ 
	private SoundPool mSoundPool;
	/**声音对象id***/ 
	private int mSoundID;
	
	/**是否滑动前往首页 ***/ 
	private boolean isGoHome = false;
	
	/**滑动时最后移动比率**/
	private float lastPositionOffset = 0.0f;
	
	
	/**
	 * 在activity的onCreate执行,初始化引导页
	 * @param context
	 * @param frameLayout activity整体布局
	 * @param imageDrawableID 引导页图片的resid
	 */
	public void initGuideImage(Context context, FrameLayout frameLayout, Integer[] imageDrawableID){
		this.mContext = context;
		if(context instanceof GuideListener){
			this.mGuideListener = (GuideListener) context;
		}
		
		//创建ViewPager
		mViewPager = new ViewPager(mContext);
		mViewPager.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
		// 初始化引导图片列表
		iniGuideImageList(imageDrawableID);
		// 创建Adapter
		mVPAdapter = new VPAdapter(views);
		//设置Adapter
		mViewPager.setAdapter(mVPAdapter);		
		// 绑定页面改变监听
		mViewPager.setOnPageChangeListener(this);
		
		//加入整体布局
		frameLayout.addView(mViewPager, 0);
		
	}
	
	/**
	 * 初始化 点击开始按键的声音
	 * @param startSoundID 声音文件,放在raw文件夹 R.raw.guide_btn_sound
	 */
	public void initStartSound(int startSoundID) {
		// 设置声音池
		mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
		mSoundID = mSoundPool.load(mContext, startSoundID, 100);
	}
	/**
	 * 初始化 显示第几页引导页的标识,跟开始按键
	 * @param linearLayout 是一个布局,引导页的标识的ViewGroup跟一个开始按键
	 * @param dotViewGroupID 引导页的标识的ViewGroup的ID,获取该布局 里面应该有表示有多少个引导页标识的ImageView
	 * @param startBtnID  开始按键的ID
	 */
	public void initDots(LinearLayout linearLayout, int dotViewGroupID, int startBtnID) {
		initDots(linearLayout, dotViewGroupID, startBtnID, true);
	}
	
	/**
	 * 初始化 显示第几页引导页的标识,跟开始按键
	 * @param linearLayout 是一个布局,引导页的标识的ViewGroup跟一个开始按键
	 * @param dotViewGroupID 引导页的标识的ViewGroup的ID,获取该布局 里面应该有表示有多少个引导页标识的ImageView
	 * @param startBtnID  开始按键的ID
	 * @param startBTNisVISIBLE 开始按键是否长期显示,true表示是,false表示只在最后一页显示
	 */
	public void initDots(LinearLayout linearLayout, int dotViewGroupID, int startBtnID, boolean startBTNisVISIBLE) {
		this.startBTNisVISIBLE = startBTNisVISIBLE;
		 try {
			 //设置开始按键点击监听
			 startBTN = linearLayout.findViewById(startBtnID);
		} catch (Exception e) {
			Log.e("Guide", "initDots方法传入布局为空!"+e);
			return;
		}
		if(startBTN != null){
			startBTN.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					// 设置已经引导
					PreferencesUtils.putBoolean(mContext, XConstent.KEY_GUIDE_SWITCH, false);
					// 点击按键响声音
					if(mSoundPool != null)
						mSoundPool.play(mSoundID, 1.0f, 1.0f, 100, 0, 1.0f);
					//去首页
					if(mGuideListener != null)
						mGuideListener.goHome();
				}
			});			
		}
		
		//判断引导页数量跟标识数量是否一致
		ViewGroup dotViewGroup = (ViewGroup) linearLayout.findViewById(dotViewGroupID);
		int childCount = 0;
		if(dotViewGroup != null){
			childCount = dotViewGroup.getChildCount();
		}
		if(childCount != views.size()){
			Log.e("Guide", "引导页数量跟标识数量不一致!");
			return;
		}
		dots = new ImageView[childCount];
		// 循环取得小点图片
		for (int i = 0; i < childCount; i++) {
			dots[i] = (ImageView) dotViewGroup.getChildAt(i);
			// 都设为不选中状态
			dots[i].setEnabled(false);
		}	
		currentIndex = 0;
		// 设置为选中状态
		dots[currentIndex].setEnabled(true);
	}


	/**
	 * 初始化引导图片列表
	 * @param imageRes
	 */
	private void iniGuideImageList(Integer[] imageDrawableID) {
		views = new ArrayList<View>();
		//如果imageRes为空,则直接返回
		if(ArrayUtils.isEmpty(imageDrawableID)) return;
		
		LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		for(int i = 0; i < imageDrawableID.length; i++){
			//创建ImageView
			ImageView imageView = new ImageView(mContext);
			//设置布局
			imageView.setLayoutParams(layoutParams);
			//是否保持宽高比。需要与maxWidth、MaxHeight一起使用，否则单独使用没有效果
			imageView.setAdjustViewBounds(false);
			imageView.setMaxHeight(LayoutParams.MATCH_PARENT);
			imageView.setMaxWidth(LayoutParams.MATCH_PARENT);
			//设置获取焦点
			imageView.setFocusable(true);
			//按比例扩大图片的size居中显示，使得图片长(宽)等于或大于View的长(宽)
			imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
			//设置图片
			imageView.setImageResource(imageDrawableID[i]);
			//加入图片列表
			views.add(imageView);
		}
	}
		

	//设置化小圆点
	private void setCurrentDot(int position) {
		//如果选择也超过范围或者等于当前页
		if (position < 0 || position > views.size() - 1
				|| currentIndex == position) {
			return;
		}
		//设为选中状态
		dots[position].setEnabled(true);
		//设为不选中状态
		dots[currentIndex].setEnabled(false);
		//更新当前选择点
		currentIndex = position;
	}


	@Override
	//当滑动状态改变时调用
	public void onPageScrollStateChanged(int position) {		
		if(mGuideListener != null)
			mGuideListener.onPageScrollStateChanged(position);
	}


	@Override
	//当当前页面被滑动时调用
	public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
		//如果没有开始按键且isGoHome标识为false
		if(startBTN == null && !isGoHome){
			//如果当前页 是最后一页,而且是向右滑动1/4,则跳进首页 
			if(currentIndex == views.size()-1 && positionOffset > 0.25  && lastPositionOffset > positionOffset){
				Log.e("Guide", "如果是最右一页,而且是向左滑动,则跳进首页  positionOffset:"+positionOffset+"    positionOffsetPixels:"+positionOffsetPixels);
				isGoHome = true;			
			}
		}
		if(mGuideListener != null)
			mGuideListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
		//更新最后滑动象素
		lastPositionOffset = positionOffset;
	}


	@Override
	//当新的页面被选中时调用
	public void onPageSelected(int position) {
		//更新最后滑动象素
		lastPositionOffset = 0.0f;
		//设置开始按键显示于隐藏
		if(!startBTNisVISIBLE){
			if(position == views.size()-1){
				startBTN.setVisibility(View.VISIBLE);
			}else{
				startBTN.setVisibility(View.INVISIBLE);
			}
		}
		//设置标识的状态
		if(!ArrayUtils.isEmpty(dots)){
			setCurrentDot(position);
		}
		
		if(mGuideListener != null){
			mGuideListener.onPageSelected(position);
			//去首页
			if(isGoHome)
				mGuideListener.goHome();
		}
	}
	
	
	
}
